package com.itheima.health.job.task;

import com.itheima.health.common.RedisConst;
import com.itheima.health.service.SetmealService;
import com.itheima.health.util.QiniuUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Set;

@Component
@Slf4j
public class CleanTask {

    private final static Long MAX_TIME = 30 * 60 * 1000L; //设置常量 允许存放的最大时间 30*60*1000毫秒 = 30分钟

    @Autowired
    private RedisTemplate redisTemplate;

    @DubboReference
    private SetmealService setmealService;

    @Autowired
    private QiniuUtils qiniuUtils;

    //设置每隔2分钟执行一次定时任务
    @Scheduled(cron = "0 2 * * * ?")
    public void cleanImage() {
        LocalDateTime now = LocalDateTime.now();
        log.info("{} 定时任务开始执行……", now);
        //将redis set集合中的图片获取出来
        Set<String> members = redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES).members();
        //遍历
        for (String fileName : members) {
            //截取文件名称获取时间戳
            String[] split = fileName.split("_");
            //存入redis中时的时间戳  被截取成三段 第一段是时间戳 第二段是uuid 第三段是原文件名
            Long createTiem = Long.valueOf(split[0]);
            //使用当前时间 - 获取到的时间戳 得到已经存在了多久
            //对比是否小于允许存储的最大时间
            if ((System.currentTimeMillis() - createTiem) < MAX_TIME) {
                //如果小于则放行 不做任何操作
                log.info("{} 文件未超时，自动忽略！",fileName);
                continue; //跳过
            }
            //获取套餐中文件名称的数量
            int count = setmealService.count(fileName);
            //如果大于 进行判断 该文件是否被使用
            if (count == 0) {
                //如果没有被使用则从七牛云中删除该文件
                qiniuUtils.deleteFileFromQiniu(fileName);
                log.info("{} 文件超时没有使用，已从七牛云中删除！",fileName);
            }
            //如果大于允许最大时间 则从redis中删除该文件
            redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES).remove(fileName);
            log.info("{} 文件超时，已从redis中删除！",fileName);
        }
    }

}
